package com.activiti6.demo.util;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.List;
import java.util.Map;

/**
 * @Auther: 周作为
 * @Date: 2019/4/14 18:07
 * @Description:
 */
public class ExcelUtils {


    /**
     * 行高
     */
    private static final short WIDTH = (short) 35.7;

    /**
     * 列宽（像素数）
     */
    private static final Integer COUNT = 150;

    /**
     * 字体高度
     */
    private static final int TEN = 14;


    /**
     * 创建excel文档
     * @param keys
     *            list中map的key数组集合
     * @param columnNames
     *            excel的列名
     * @param list 写入的数据列表
     *
     * @param sheetName 表单名
     * @return 结果
     */
    public static Workbook createWorkBook(final List<Map<String, Object>> list,
                                          final String[] keys, final String[] columnNames,final String sheetName){


        //创建HSSFWorkbook对象(excel的文档对象)
        HSSFWorkbook wb = new HSSFWorkbook();

        //建立新的sheet对象（excel的表单）
        HSSFSheet sheet=wb.createSheet(sheetName);

        //设置指定列的列宽
        for (int i = 0; i < keys.length; i++)
        {
            sheet.setColumnWidth(i, WIDTH * COUNT);
        }

        //创建两种字体样式
        //设置第一种单元格字体的样式（用于列名）
        HSSFFont fontNameStyle=wb.createFont();
        fontNameStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        fontNameStyle.setFontHeightInPoints((short)TEN);
        fontNameStyle.setFontName("宋体");
        fontNameStyle.setColor(HSSFColor.BLACK.index);

        //设置第二种单元格字体的样式（用于值）
        HSSFFont fontValueStyle=wb.createFont();
        fontNameStyle.setFontHeightInPoints((short)TEN);
        fontNameStyle.setFontName("宋体");
        fontNameStyle.setColor(HSSFColor.BLACK.index);

        //创建两种单元格样式
        //设置第一种单元格的样式（用于列名）
        HSSFCellStyle cellNameStyle=wb.createCellStyle();
        cellNameStyle.setFont(fontNameStyle);
        cellNameStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cellNameStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        //设置第二种单元格的样式（用于值）
        HSSFCellStyle cellValueStyle=wb.createCellStyle();
        cellValueStyle.setFont(fontValueStyle);
        cellValueStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cellValueStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);





        //创建第一行
        HSSFRow row1=sheet.createRow(0);


        HSSFCell cell1=row1.createCell(0);

        HSSFCell cell2=row1.createCell(1);
        HSSFCell cell3=row1.createCell(3);
        HSSFCell cell4=row1.createCell(4);

        //设置第一行的列
        cell1.setCellValue("项目编号");
        cell1.setCellStyle(cellNameStyle);

        cell2.setCellValue("JSPNO12334");
        cell2.setCellStyle(cellValueStyle);

        cell3.setCellValue("项目名称");
        cell3.setCellStyle(cellNameStyle);

        cell4.setCellValue("正邦饲料");
        cell4.setCellStyle(cellValueStyle);


        //合并单元格CellRangeAddress构造参数依次表示起始行，截至行，起始列， 截至列
        sheet.addMergedRegion(new CellRangeAddress(0,0,1,2));
        sheet.addMergedRegion(new CellRangeAddress(0,0,4,5));





        //创建第二行
        HSSFRow row2=sheet.createRow(1);
        // 设置列名
        for (int i = 0; i < columnNames.length; i++)
        {
            HSSFCell cell = row2.createCell(i);
            cell.setCellValue(columnNames[i]);
            cell.setCellStyle(cellNameStyle);
        }

        // 从第三行开始设置数据
        for (int i = 2; i < list.size(); i++)
        {
            // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
            // 创建一行，在页sheet上
            HSSFRow row = sheet.createRow(i);
            // 在row行上创建一个方格
            for (int j = 0; j < keys.length; j++)
            {
                HSSFCell cell = row.createCell(j);

                if (list.get(i-2).get(keys[j]) == null)
                {
                    cell.setCellValue(" ");
                } else
                {
                    cell.setCellValue(list.get(i-2).get(keys[j]).toString());
                }

                cell.setCellStyle(cellValueStyle);
            }
        }
        return wb;
    }
}
